package com.maozzi.array;

import java.util.Arrays;

/**
 * 数组二分查找
 *
 * @author maozi
 */
public class BinarySearch {
    public static void main(String[] args) {

//        int[] arr1 = {-1, 0, 3, 5, 9, 12};
        int[] arr1 = {1, 2, 3, 4, 7, 9, 10};
//        System.out.println(search(arr1, 10));
        System.out.println(removeElement(arr1,2));
    }

    /**
     * 给定一个 n 个元素有序的（升序）整型数组 nums 和一个目标值 target，
     * 写一个函数搜索 nums 中的 target，如果目标值存在返回下标，否则返回 -1。
     */
    public static int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (nums[mid] < target) {
                left = mid + 1;
            } else if (nums[mid] > target) {
                right = mid - 1;
            } else {
                return mid;
            }
        }
        return -1;
    }

    /**
     * 给你一个非负整数 x ，计算并返回 x 的 算术平方根 。
     * <p>
     * 由于返回类型是整数，结果只保留 整数部分 ，小数部分将被 舍去 。
     * <p>
     * 注意：不允许使用任何内置指数函数和算符，例如 pow(x, 0.5) 或者 x ** 0.5 。
     */
    public static int mySqrt(int x) {
        int left = 0;
        int right = x;
        int res = -1;
        while (left <= right) {
            int mid = left + (right - 1) / 2;
            if (mid * mid <= x) {
                res = mid;
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return res;
    }

    /**
     * 给你一个正整数 num 。如果 num 是一个完全平方数，则返回 true ，否则返回 false 。
     * <p>
     * 完全平方数 是一个可以写成某个整数的平方的整数。换句话说，它可以写成某个整数和自身的乘积。
     * <p>
     * 不能使用任何内置的库函数，如  sqrt 。
     */
    public static boolean isPerfectSquare(int num) {
        int left = 0;
        int right = num;
        while (left <= right) {
            int mid = (left + right) / 2;
            if ((long) mid * mid == num) {
                return true;
            } else if ((long) mid * mid < num) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return false;
    }

    public static int removeElement(int[] nums, int val) {
        int res = 0;
        for (int i = 0; i < nums.length - 1; i++) {
            if (nums[i] == val) {
                nums[i] = 1000;
            }else{
                res++;
            }
        }
        Arrays.sort(nums);
        return res;
    }
}
